﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Dm;
using System.IO;

namespace OneClick
{
    public partial class Form1 : Form

    {
        二级代码 f1;
        列统计信息 f2;

        public static int woshibushijinglaiguo = 0;//通过这个控制 只有连接信息点击确认才会进入后续代码

        //添加记录日志功能，查询过哪些表
        //附加形式的，每次都是添加 每次写完要 .Flush();程序关闭时，释放文件占用

        static String[] Tbname = new String[10]; // 20180202 创建，目前还没用上 可以直接删除

        public static string banbenxinxi;

        public static int bottom;//我是那个按钮

        public static string sstr;
        public static string Clo;
        public static string Comment;
        public static string Tab;
        public static string Sch;
        public static string Other;
        private static int count_;
        public static decimal num_1 = 0;
        public decimal num_2 = 0;
        static DmConnection cnn = new DmConnection();
        public Form1()
        {
            InitializeComponent();
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        public static int dis_combo(object sender, EventArgs e, ComboBox cb) //因为 连接信息里面也想调用
        {
            //删除下拉选项框中重复项
            int count = cb.Items.Count;
            for (int i = 0; i < count; i++)
            {
                //int num=cb.FindString(cb.Items[1].ToString());
                string str = cb.Items[i].ToString();
                for (int j = i + 1; j < count; j++)
                {
                    string str1 = cb.Items[j].ToString();
                    if (str1 == str)
                    {
                        cb.Items.RemoveAt(j);
                        count--;
                        j--;
                    }
                }

            }
            return 0;
            // 连接信息里面调用 要有返回值
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //load时，就读取下文件 填充 模式 和 表的 comb
            sotre(sender, e, "TT", "TT");

            label7.Text = "I`M UTab";
            label6.Text = "";
            Other = "No"; // No or Yes
            连接信息 f;
            f = new 连接信息();
            f.ShowDialog();
            //f.Show();
            if (woshibushijinglaiguo == 0)
            {
                System.Environment.Exit(0);
            }
            label1.Text = f.Get1();
            banbenxinxi = label1.Text;
            sstr = f.ccstr;
            cnn.ConnectionString = sstr;
            textBox1.Text = "AC43";
            textBox2.Text = "HNSIMIS";
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void sotre(object sender, EventArgs e, String Sch, String Tab)
        {

            FileStream file_ = new FileStream("oneclick.log", FileMode.Append);
            StreamWriter file_log = new StreamWriter(file_);
            file_log.WriteLine(DateTime.Now.ToString("yyyy_MM_dd_") + DateTime.Now.TimeOfDay.ToString() + "[delete]$" + Sch + "$" + Tab);
            file_log.Flush();
            file_.Close();

            //FileStream file_1 = new FileStream("oneclick.log", FileMode.Append);
            StreamReader file_log_1 = new StreamReader("oneclick.log");

            String line0;
            while ((line0 = file_log_1.ReadLine()) != null)
            {
                if (line0.IndexOf("$") > 0)
                {


                    //1 是表名 2 是用户名
                    textBox1.Items.Add(line0.Split('$')[2]);
                    textBox2.Items.Add(line0.Split('$')[1]);

                    // 每次添加 都去处重复
                    dis_combo(sender, e, textBox1);
                    dis_combo(sender, e, textBox2);
                }
            }
            file_log_1.Close();

        }

        private void button1_Click(object sender, EventArgs e)
        {
            bottom = 1;
            count_ = 1;
            string Sch = textBox2.Text;
            string Tab = textBox1.Text;
            string CC_t_v = "UTAB";
            sotre(sender, e, Sch, Tab);

            //string sql1 = "select DISTINCT AAA101 from hnsimis.aA10 where aaa100 = trim(upper('" + COL.Replace('\t',' ') + "'))";
            ///string sql3 = "select owner, COLUMN_NAME NAME,comments from all_col_comments where schema_name = trim(upper('" + Sch.Replace('\t', ' ') + "')) and table_name = trim(upper('" + Tab.Replace('\t', ' ') + "'))";
            /*用下面这个语句太慢了*/
            /////string sql3 = "with a as(select   a.column_name col,b.constraint_type type_ from all_cons_columns a, all_constraints b  where a.constraint_name = b.constraint_name and a.table_name = trim(upper('" + Tab.Replace('\t', ' ') + "')) and a.owner=trim(upper('" + Sch.Replace('\t', ' ') + "')) AND A.OWNER=B.OWNER) select owner,COLUMN_NAME NAME,comments,a.type_ key_notes from all_col_comments b left join a on b.COLUMN_NAME = a.col where schema_name=trim(upper('" + Sch.Replace('\t', ' ') + "')) and table_name=trim(upper('" + Tab.Replace('\t', ' ') + "'))";
            //替换为下面的sql3，添加列类型，和是否为空//string sql3 = "with a as( SELECT O_USR.NAME AS OWNER1 	,O_CONS.NAME AS CONSTRAINT_NAME1 	,CAST(CASE 			WHEN S_CONS.TYPE$ = 'F' 				THEN 'R' 			ELSE S_CONS.TYPE$ 			END AS VARCHAR(1)) AS type_ 	,O_TAB.NAME AS TABLE_NAME1 	,COLS.NAME col FROM SYS.SYSCONS S_CONS 	,SYS.SYSOBJECTS O_CONS 	,SYS.SYSOBJECTS O_TAB 	,SYS.SYSOBJECTS O_USR 	,SYS.SYSCONS CON LEFT JOIN SYS.SYSINDEXES I ON I.ID = CON.INDEXID 	,SYS.SYSCOLUMNS COLS WHERE O_CONS.SUBTYPE$ = 'CONS' 	AND CON.ID = S_CONS.ID 	AND COLS.ID = O_TAB.ID 	AND O_CONS.ID = S_CONS.ID 	AND O_TAB.SUBTYPE$ = 'UTAB' 	AND O_TAB.ID = S_CONS.TABLEID 	AND O_USR.ID = O_TAB.SCHID 	AND O_USR.TYPE$ = 'SCH' 	AND O_USR.NAME = trim(upper('" + Sch.Replace('\t', ' ') + "')) AND O_TAB.NAME = trim(upper('" + Tab.Replace('\t', ' ') + "')) AND ( 		SF_COL_IS_IDX_KEY(I.KEYNUM, I.KEYINFO, COLS.COLID) = 1 		OR CON.CHECKINFO IS NOT NULL 		) ) select owner,COLUMN_NAME NAME,comments,a.type_ key_notes from all_col_comments b left join a on b.COLUMN_NAME = a.col where schema_name=trim(upper('" + Sch.Replace('\t', ' ') + "')) and table_name=trim(upper('" + Tab.Replace('\t', ' ') + "'));";
            string sql3 = "with a as (SELECT O_USR.NAME AS OWNER1 , O_CONS.NAME AS CONSTRAINT_NAME1, CAST(CASE WHEN S_CONS.TYPE$ = 'F' THEN 'R' ELSE S_CONS.TYPE$ END AS VARCHAR(1)) AS type_, O_TAB.NAME AS TABLE_NAME1 , COLS.NAME col FROM SYS.SYSCONS S_CONS, SYS.SYSOBJECTS O_CONS, SYS.SYSOBJECTS O_TAB, SYS.SYSOBJECTS O_USR, SYS.SYSCONS CON LEFT JOIN SYS.SYSINDEXES I ON I.ID = CON.INDEXID, SYS.SYSCOLUMNS COLS WHERE O_CONS.SUBTYPE$ = 'CONS' AND CON.ID = S_CONS.ID AND COLS.ID = O_TAB.ID AND O_CONS.ID = S_CONS.ID AND O_TAB.SUBTYPE$ = 'UTAB' AND O_TAB.ID = S_CONS.TABLEID AND O_USR.ID = O_TAB.SCHID AND O_USR.TYPE$ = 'SCH' AND O_USR.NAME = trim(upper('" + Sch.Replace('\t', ' ') + "')) AND O_TAB.NAME = trim(upper('" + Tab.Replace('\t', ' ') + "')) AND(SF_COL_IS_IDX_KEY(I.KEYNUM, I.KEYINFO, COLS.COLID) = 1 OR CON.CHECKINFO IS NOT NULL) ), tmp_b as(SELECT COL.NAME,COL.TYPE$,COL.LENGTH$,COL.SCALE,COL.NULLABLE$ FROM SYSOBJECTS SCH,SYSOBJECTS TAB, SYSCOLUMNS COL WHERE SCH.ID = TAB.SCHID AND TAB.ID = COL.ID AND SCH.NAME = trim(upper('" + Sch.Replace('\t', ' ') + "')) AND TAB.NAME = trim(upper('" + Tab.Replace('\t', ' ') + "')) ) select owner, COLUMN_NAME NAME, comments , a.type_ key_notes, case when scale = 0 then COL.TYPE$|| '(' || COL.LENGTH$|| ')' else COL.TYPE$|| '(' || COL.LENGTH$|| ',' || COL.SCALE || ')' end , COL.NULLABLE$ from all_col_comments b left join a on b.COLUMN_NAME = a.col,tmp_B col where col.name = COLUMN_NAME and schema_name = trim(upper('" + Sch.Replace('\t', ' ') + "')) and table_name = trim(upper('" + Tab.Replace('\t', ' ') + "'));";
            //string sql4 = "select OWNER,TABLE_NAME NAME,COMMENTS from ALL_TAB_COMMENTS where owner=trim(upper('" + Sch.Replace('\t', ' ') + "')) and table_name=trim(upper('" + Tab.Replace('\t', ' ') + "'))";
            // new sql4
            string sql_tab_used = "select table_used_space(trim(upper('" + Sch.Replace('\t', ' ') + "')),trim(upper('" + Tab.Replace('\t', ' ') + "')))/1024.0/1024.0*PAGE;";
            string sql4 = "SELECT A.NAME,B.NAME,A.SUBTYPE$,C.COMMENT$ FROM SYSOBJECTS A join SYSOBJECTS B on A.SCHID=B.ID left join SYSTABLECOMMENTS C on C.SCHNAME=B.NAME AND C.TVNAME=A.NAME WHERE B.NAME = trim(upper('" + Sch.Replace('\t', ' ') + "')) AND A.NAME = trim(upper('" + Tab.Replace('\t', ' ') + "'))";
            cnn.Open();
            DmCommand command = new DmCommand();
            command.Connection = cnn;
            try
            {
                string a;
                string b;
                string c;
                string d;
                string e1;
                string f;
                command.CommandText = sql3;
                DmDataReader reader = command.ExecuteReader();
                //foreach (string item in listBox1.Items)
                //{
                //    listBox1.Items.Remove(item);
                //}
                /*处理无效对象绑定问题 >> 截断留存部分 <<的问题  换成Items.Clear()*/
                ///while (listBox2.Items.Count > 0)
                ///{
                ///    listBox2.Items.Remove(listBox2.Items[0]);
                ///}
                ///////DataTable dt = reader.Read();
                listBox2.Items.Clear();
                //datagrid屏蔽//DataGridViewTextBoxColumn  col1 = new DataGridViewTextBoxColumn();
                //datagrid屏蔽//DataGridViewTextBoxColumn col2 = new DataGridViewTextBoxColumn();
                //datagrid屏蔽//DataGridViewTextBoxColumn col3 = new DataGridViewTextBoxColumn();
                //datagrid屏蔽//DataGridViewTextBoxColumn col4 = new DataGridViewTextBoxColumn();
                //datagrid屏蔽//col1.HeaderText = "姓名";//'设置标题中显示的文本  
                //datagrid屏蔽//col2.HeaderText = "姓名";//'设置标题中显示的文本  
                //datagrid屏蔽//col3.HeaderText = "姓名";//'设置标题中显示的文本  
                //datagrid屏蔽//col4.HeaderText = "姓名";//'设置标题中显示的文本  
                //'将新建的列添加到控件中  
                //datagrid屏蔽//dataGridView1.Columns.Add(col1);
                //datagrid屏蔽//dataGridView1.Columns.Add(col2);
                //datagrid屏蔽//dataGridView1.Columns.Add(col3);
                //datagrid屏蔽//dataGridView1.Columns.Add(col4);
                int ii = 0;
                while (reader.Read())
                {
                    a = reader.GetString(0);
                    b = reader.GetString(1);
                    c = reader.GetString(2);
                    d = reader.GetString(3);
                    e1 = reader.GetString(4);
                    f = reader.GetString(5);
                    //datagrid屏蔽//DataGridViewRow row = new DataGridViewRow();
                    //datagrid屏蔽//row.CreateCells(dataGridView1);
                    //datagrid屏蔽////'设置单元格的值  
                    //datagrid屏蔽//row.Cells[0].Value = a;
                    //datagrid屏蔽//row.Cells[1].Value = b;
                    //datagrid屏蔽//row.Cells[2].Value = c;
                    //datagrid屏蔽//row.Cells[3].Value = d;
                    //datagrid屏蔽//dataGridView1.Rows.Add(row);
                    if (d == "P")
                    {
                        d = "$P";
                    }
                    if (d == "")
                    {
                        d = "*";
                    }
                    listBox2.Items.Add(ii+"=>"+a + "\t" + b + "\t" + d + "\t" + f + "\t" + e1 + "\t" + c);
                    ii += 1;
                    if (d == "$P")
                    {
                        //label1.Text = (d);
                        this.listBox2.DrawMode = DrawMode.OwnerDrawFixed;
                        this.listBox2.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.listBox2_DrawItem);
                    }

                }
                reader.Close();
                label1.Text = banbenxinxi;//一个5个地方 通过查找 lable1 的应用就能找到，即只要用 lable1 输出错误的地方，在未报异常时，都要重新 lable1.Text 为版本信息
            }
            catch (Exception ex)
            {
                label1.Text = (ex.Message);
            }
            cnn.Close();


            //填充sql4 表注释

            cnn.Open();
            command = new DmCommand();
            command.Connection = cnn;
            try
            {
                string a;
                string b;
                string c;
                string d;
                command.CommandText = sql4;
                DmDataReader reader = command.ExecuteReader();
                //foreach (string item in listBox1.Items)
                //{
                //    listBox1.Items.Remove(item);
                //}
                ///while (listBox1.Items.Count > 0)
                ///{
                ///    listBox1.Items.Remove(listBox1.Items[0]);
                ///}
                listBox1.Items.Clear();
                while (reader.Read())
                {
                    a = reader.GetString(0);
                    b = reader.GetString(1);
                    c = reader.GetString(2);
                    d = reader.GetString(3);
                    listBox1.Items.Add(a + "  " + b + "  " + c);
                    listBox1.Items.Add(d);
                    if (c != "UTAB")
                    {
                        CC_t_v = "View";
                        label7.Text = ("I'm View!");
                        count_ = 0;

                    }

                }
                reader.Close();
                label1.Text = banbenxinxi;
            }
            catch (Exception ex)
            {
                label1.Text = (ex.Message);
            }
            cnn.Close();

            //填充 sql_tab_used lable11
            label11.Text = "---";
            if (CC_t_v == "UTAB")
            {
                label11.Text = "+--";
                cnn.Open();
                command = new DmCommand();
                command.Connection = cnn;
                label11.Text = sql_tab_used;
                try
                {
                    Double a;
                    command.CommandText = sql_tab_used;
                    DmDataReader reader = command.ExecuteReader();
                    while (reader.Read())
                    {
                        label11.Text = "++-";
                        a = reader.GetDouble(0);
                        if (a > 1024)
                        {
                            label11.Text = (Math.Round(a/1024,3)  + " GB");
                        }
                        else
                        {
                            label11.Text = (a + " MB");
                        }

                    }
                    reader.Close();
                    label1.Text = banbenxinxi;
                }
                catch (Exception ex)
                {
                    label1.Text = (ex.Message);
                    //label11.Text = (ex.Message);
                }
                cnn.Close();
            }

            if (count_ == 1)
            {
                //获取行数
                //string sql1 = "select DISTINCT AAA101 from hnsimis.aA10 where aaa100 = trim(upper('" + COL.Replace('\t',' ') + "'))";
                string sql13 = "select count(*) from " + Sch.Replace('\t', ' ').Trim() + "." + Tab.Replace('\t', ' ').Trim();
                //填充sql3 列注释
                cnn.Open();
                command = new DmCommand();
                command.Connection = cnn;
                try
                {
                    decimal a;
                    command.CommandText = sql13;
                    DmDataReader reader = command.ExecuteReader();
                    //foreach (string item in listBox1.Items)
                    //{
                    //    listBox1.Items.Remove(item);
                    //}
                    while (reader.Read())
                    {
                        a = reader.GetDecimal(0);
                        num_1 = a;
                        label6.Text = "表数据量:" + a;
                    }
                    reader.Close();
                    label1.Text = banbenxinxi;
                }
                catch (Exception ex)
                {
                    label1.Text = (ex.Message);
                }

                //获取表中统计信息的行数
                string sql14 = "dbms_stats.table_stats_show(upper('" + Sch.Replace('\t', ' ').Trim() + "'),upper(\'" + Tab.Replace('\t', ' ').Trim() + "'))";
                //填充 sql14 列注释
                //就用前面的 cnn 填充完这个 再关闭

                try
                {
                    decimal a;
                    command.CommandText = sql14;
                    DmDataReader reader = command.ExecuteReader();

                    while (reader.Read())
                    {
                        a = reader.GetDecimal(0);
                        num_2 = a;
                        label6.Text = label6.Text + "  " + "统计量:" + a + "\r\n统计差额比:" + Math.Round(Math.Abs(num_1 - num_2) / num_2, 4);//保留四位小数
                    }
                    reader.Close();
                    label1.Text = banbenxinxi;
                }
                catch (Exception ex)
                {
                    label1.Text = (ex.Message);
                }

                cnn.Close();
            }
            else
            {
                label6.Text = "视图 不count";
            }

        }

        private void listBox2_DrawItem(object sender, DrawItemEventArgs e)
        {
            string s = this.listBox2.Items[e.Index].ToString();
            if (s.Contains("$P"))
            {
                e.Graphics.DrawString(s, this.Font, Brushes.Blue, e.Bounds);
            }
            else
                e.Graphics.DrawString(s, this.Font, new SolidBrush(this.ForeColor), e.Bounds);

        }

        private void label4_Click(object sender, EventArgs e)
        {

        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {

        }

        private void listView1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void textBox2_TextChanged_1(object sender, EventArgs e)
        {

        }

        private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            // //Clipboard.SetText(string.Join("\r\n", listBox2.SelectedItem.ToString()));
            // if (Other == "Yes")
            // { 
            // Clo= listBox2.SelectedItem.ToString().Split('\t')[1];
            // 二级代码 f;
            // f = new 二级代码();
            //     //f.ShowDialog();
            //     f.Show();
            // }
        }

        private void listBox2_MouseClick(object sender, MouseEventArgs e)
        {
            //Clipboard.SetText(string.Join("\r\n", listBox2.SelectedItem.ToString()));
            if (Other == "Yes")
            {
                Clo = listBox2.SelectedItem.ToString().Split('\t')[1];

                f1 = new 二级代码();
                //f.ShowDialog();
                f1.Show();
            }
        }


        //不想让XX知道索引结构，避免一些不必要的事情
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            Sch = textBox2.Text.Replace(" ", "");
            Tab = textBox1.Text.Replace(" ", "");
            索引信息 f;
            f = new 索引信息();
            //f.ShowDialog();
            f.Show();
        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void label6_Click(object sender, EventArgs e)
        {

        }

        private void textBox3_TextChanged(object sender, EventArgs e)
        {
            if (textBox3.Text.Length == 0)
            {
                if (bottom == 1)
                {
                    this.button1_Click(sender, e);
                }
                else if (bottom == 2)
                {
                    this.button2_Click(sender, e);
                }
                return;
            }
            string box3 = textBox3.Text.ToUpper();
            //try { 
            for (int i = 0; i < listBox2.Items.Count; i++)
            {
                string str = listBox2.Items[i].ToString();
                ///label8.Text= listBox2.Items[i].ToString();
                //label1.Text = label1.Text+'+'+i.ToString();
                int index = str.IndexOf(box3);
                if (index == -1)
                {
                    listBox2.Items.Remove(str);
                    i -= 1;// 嗯 很精髓
                }
            }
            //}
            //catch (Exception ex)
            //{
            //label1.Text = ex.Message;
            //}
        }

        private void label7_Click(object sender, EventArgs e)
        {

        }

        private void dataGridView1_CellContentClick_1(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void label8_Click(object sender, EventArgs e)
        {

        }

        private void label3_Click(object sender, EventArgs e)
        {

        }

        private void listBox1_MouseEnter(object sender, EventArgs e)
        {
            bool _isBtnCutoutToolTip = false; //在MouseEnter事件里做一个判断就好了， 
            if (_isBtnCutoutToolTip) return; //_isBtnCutoutToolTip在第一次tooltip.SetToolTip()设置之后赋值为true即可。这样就不会重复设置提示框了导致多提示框了
            ToolTip p = new ToolTip();
            p.ShowAlways = true;
            p.SetToolTip(this.listBox1, "点击查看索引");
            _isBtnCutoutToolTip = true;
        }

        private void listBox2_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            try { f1.Close(); }
            catch (Exception ex) { };
            Comment = listBox2.SelectedItem.ToString().Split('\t')[5];
            Clo = listBox2.SelectedItem.ToString().Split('\t')[1];
            Sch = textBox2.Text.Replace(" ", "");
            Tab = textBox1.Text.Replace(" ", "");

            f2 = new 列统计信息();
            //f.ShowDialog();
            f2.Show();
        }

        private void label9_Click(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            String ss = textBox4.Text;

            bottom = 2;
            string sql_button2 = "SELECT RPAD(SCHNAME,MAX(LENGTHB(SCHNAME)) OVER()+1),RPAD(TVNAME,MAX(LENGTHB(TVNAME)) OVER()+1),RPAD(COLNAME,MAX(LENGTHB(COLNAME)) OVER()+1),RPAD(TABLE_TYPE,MAX(LENGTHB(TABLE_TYPE)) OVER()+1),RPAD(COMMENT$,MAX(LENGTHB(COMMENT$)) OVER()+1) FROM SYSCOLUMNCOMMENTS	WHERE SCHNAME NOT IN ('SYS','SYSAUDITOR','SYSJOB','SYSSSO','SYSREP') AND COLNAME||COMMENT$ LIKE UPPER('%" + ss + "%');";
            cnn.Open();
            DmCommand command = new DmCommand();
            command.Connection = cnn;
            try
            {
                string a;
                string b;
                string c;
                string d;
                string e1;
                command.CommandText = sql_button2;
                DmDataReader reader = command.ExecuteReader();

                listBox2.Items.Clear();

                while (reader.Read())
                {
                    a = reader.GetString(0);
                    b = reader.GetString(1);
                    c = reader.GetString(2);
                    d = reader.GetString(3);
                    e1 = reader.GetString(4);
                    //if (d == "P")
                    //{
                    //    d = "$P";
                    //}
                    //if (d == "")
                    //{
                    //    d = "*";
                    //}
                    listBox2.Items.Add(c + "\t" + e1 + "\t" + b + "\t" + a + "\t" + d);
                    //if (d == "$P")
                    //{
                    //    //label1.Text = (d);
                    //    this.listBox2.DrawMode = DrawMode.OwnerDrawFixed;
                    //    this.listBox2.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.listBox2_DrawItem);
                    //}

                }
                reader.Close();
                label1.Text = banbenxinxi;//一个5个地方 通过查找 lable1 的应用就能找到，即只要用 lable1 输出错误的地方，在未报异常时，都要重新 lable1.Text 为版本信息
            }
            catch (Exception ex)
            {
                label1.Text = (ex.Message);
            }
            cnn.Close();
        }

        private void label11_Click(object sender, EventArgs e)
        {

        }
    }
}
